package com.vipboot.platform.system.crud.service;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.vipboot.framework.core.exception.ServiceException;
import com.vipboot.framework.satoken.helper.LoginHelper;
import com.vipboot.platform.system.crud.dao.SysDeptDao;
import com.vipboot.platform.system.crud.dao.SysRoleDao;
import com.vipboot.platform.system.crud.dao.SysUserDao;
import com.vipboot.platform.system.domain.bo.SysRoleBo;
import com.vipboot.platform.system.domain.vo.SysRoleVo;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 通用"数据权限过滤“服务
 */
@RequiredArgsConstructor
@Service
public class DataScopeCheckService {

    private final SysUserDao sysUserDao;
    private final SysRoleDao sysRoleDao;
    private final SysDeptDao sysDeptDao;

    /**
     * 校验用户是否有数据权限
     *
     * @param userId 用户id
     */
    public void checkUserDataScope(Long userId) {
        if (ObjectUtil.isNull(userId)) {
            return;
        }
        if (LoginHelper.isSuperAdmin()) {
            return;
        }
        // 权限过滤，统计部门使用数量
        if (sysUserDao.getBaseMapper().countUserById(userId) == 0) {
            throw new ServiceException("没有权限访问用户数据！");
        }
    }

    /**
     * 校验部门是否有数据权限
     *
     * @param deptId 部门id
     */
    public void checkDeptDataScope(Long deptId) {
        if (ObjectUtil.isNull(deptId)) {
            return;
        }
        if (LoginHelper.isSuperAdmin()) {
            return;
        }
        if (sysDeptDao.getBaseMapper().countDeptById(deptId) == 0) {
            throw new ServiceException("没有权限访问部门数据！");
        }
    }

    /**
     * 校验角色是否有数据权限
     *
     * @param roleId 角色id
     */
    public void checkRoleDataScope(Long roleId) {
        if (ObjectUtil.isNull(roleId)) {
            return;
        }
        if (LoginHelper.isSuperAdmin()) {
            return;
        }

        SysRoleBo bo = new SysRoleBo();
        bo.setRoleId(roleId);
        List<SysRoleVo> roles = sysRoleDao.list(bo);
        if (CollUtil.isEmpty(roles)) {
            throw new ServiceException("没有权限访问角色数据！");
        }
//        LambdaQueryWrapper<SysRole> lqw = Wrappers.lambdaQuery();
//        lqw.eq(SysRole::getRoleId, roleId);
//        SysRole entity = sysRoleDao.getOne(lqw);
//        if (ObjectUtil.isNull(entity)) {
//            throw new ServiceException("没有权限访问角色数据！");
//        }
    }

}
